/*
 * Symbol.h
 *
 *  Created on: Nov 24, 2011
 *      Author: bkoziak
 */

#ifndef SYMBOL_H_
#define SYMBOL_H_

#include <string>
#include <iostream>
#include <sstream>

#define SHOW_LOG true
using namespace std;

class Symbol {

public:
	/*
	 * ENUMS
	 */
	static const int NIEZDEFINIOWANY = -1;

	enum TYP_SYMBOLU {
		STALA, ZMIENNA, FUNCKJA, PROCEDURA, PROGRAM, FUNKCJA_VM
	};
	enum TYP_ZMIENNEJ {
		INTEGER, REAL, ARRAY
	};
	enum ADRESOWANIE {
		POSREDNIE, BEZPOSREDNIE
	};

	Symbol();
	Symbol(string lexem, int token);
	virtual ~Symbol();
	;
	string getLexem() const;
	void setLexem(string lexem);
	int getToken() const;
	void setToken(int token);
	int getZakres() const;
	void setZakres(int zakres);
	int getTypSymbolu() const;
	void setTypSymbolu(TYP_SYMBOLU typSymbolu);
	TYP_ZMIENNEJ getTypZmiennej() const;
	void setTypZmiennej(TYP_ZMIENNEJ typZmiennej);
	double getStalaWartosc() const;
	void setStalaWartosc(double stalaWartosc);
	int getRozmiar();
	int getAdres();
	void setAdres(int adres);
	ADRESOWANIE getAdresowanie() const;
	void setAdresowanie(ADRESOWANIE adresowanie);
	int getZakresFunkcyjny() const;
	void setZakresFunkcyjny(int zakresFunkcyjny);
	string zamienNaLexem(double wartosc);

	/*
	 * UTILS
	 */
	void log(int wciecie);
	void log();
	static string nazwaTokenu(int token);
	static string nazwaTypuSymbolu(int tSymbolu);
	static string nazwaTypuZmiennej(int tZmiennej);
    int getRozmiarNaglowkaFunkcji() const;
    void setRozmiarNaglowkaFunkcji(int rozmiarNaglowkaFunkcji);
    int getRozmiarPamieciFunkcji() const;
    void setRozmiarPamieciFunkcji(int rozmiarPamieciFunkcji);
private:
    string lexem;
    int token;
    int zakres;
    int typSymbolu;
    TYP_ZMIENNEJ typZmiennej;
    double stalaWartosc;
    int rozmiar;
    int adres;
    int zakresFunkcyjny;
    int rozmiarPamieciFunkcji;
    int rozmiarNaglowkaFunkcji;
    ADRESOWANIE adresowanie;
};

#endif /* SYMBOL_H_ */
